//! 指纹识别模块使用示例
//! 演示如何使用Fingerprint核心功能和识别引擎

use anyhow::{anyhow, Result};
use log::{debug, error, info, warn};
use std::env;
use std::path::Path;

use good_mitm::fingerprint::{FingerprintCoreEngine, FingerprintEnginePlugin};

/// 演示核心引擎的使用
async fn demo_core_engine() -> Result<()> {
    info!("=== 演示Fingerprint核心引擎 ===");
    
    // 创建核心引擎实例
    let mut core_engine = FingerprintCoreEngine::new();
    
    // 演示加载finger.json规则
    let finger_json_path = "./rules/finger/finger.json";
    if let Ok(_) = core_engine.load_finger_json(finger_json_path) {
        info!("成功从finger.json加载规则，共 {} 条规则", core_engine.rules.len());
    } else {
        warn!("无法加载finger.json规则，尝试加载YAML规则");
    }
    
    info!("核心引擎功能演示完成");
    
    Ok(())
}

/// 演示识别引擎的使用
async fn demo_engine_plugin() -> Result<()> {
    info!("=== 演示Fingerprint识别引擎 ===");
    
    // 创建识别引擎实例
    let mut engine = match FingerprintEnginePlugin::new() {
        Ok(engine) => engine,
        Err(e) => {
            error!("创建指纹识别引擎失败: {}", e);
            return Err(anyhow!("创建指纹识别引擎失败"));
        }
    };
    
    // 配置引擎参数
    engine = engine.with_timeout(5).with_workers(5);
    
    // 尝试直接加载finger.json规则
    let finger_json_path = "./rules/finger/finger.json";
    if Path::new(finger_json_path).exists() {
        if let Ok(_) = engine.load_finger_json(finger_json_path) {
            info!("成功直接加载finger.json规则");
        } else {
            warn!("直接加载finger.json失败，尝试通过load_rules加载");
            // 加载规则
            if let Err(e) = engine.load_rules().await {
                warn!("加载规则失败: {}, 将使用内置规则", e);
            }
        }
    } else {
        // 加载规则
        if let Err(e) = engine.load_rules().await {
            warn!("加载规则失败: {}, 将使用内置规则", e);
        }
    }
    
    // 获取命令行参数中的目标URL，如果没有则使用默认值
    let target = env::args().nth(1).unwrap_or_else(|| "http://example.com".to_string());
    
    // 执行快速识别
    info!("对目标 {} 执行快速指纹识别...", target);
    match engine.quick_identify(&target).await {
        Ok(result) => {
            info!("快速识别完成，发现 {} 个技术", result.technologies.len());
            for tech in &result.technologies {
                info!("- {} (类别: {}, 版本: {})", 
                      tech.name, tech.category, tech.version);
            }
        },
        Err(e) => {
            error!("快速识别失败: {}", e);
        }
    }
    
    // 执行完整识别
    info!("\n对目标 {} 执行完整指纹识别...", target);
    match engine.identify(&target).await {
        Ok(result) => {
            info!("完整识别完成，发现 {} 个技术", result.technologies.len());
            for tech in &result.technologies {
                info!("- {} (ID: {}, 类别: {}, 版本: {})", 
                      tech.name, tech.id, tech.category, tech.version);
                if !tech.description.is_empty() {
                    info!("  描述: {}", tech.description);
                }
            }
            
            // 将结果转换为JSON
            let result_json = serde_json::to_string_pretty(&result)?;
            info!("\n识别结果(JSON格式):\n{}", result_json);
        },
        Err(e) => {
            error!("完整识别失败: {}", e);
        }
    }
    
    Ok(())
}

/// 主函数
#[tokio::main]
async fn main() -> Result<()> {
    // 配置日志
    env_logger::Builder::new()
        .filter_level(log::LevelFilter::Info)
        .format(|buf, record| {
            writeln!(buf, "[{}] {}", record.level(), record.args())
        })
        .init();
    
    info!("=== Fingerprint模块使用示例 ===");
    
    // 演示核心引擎
    if let Err(e) = demo_core_engine().await {
        error!("演示核心引擎失败: {}", e);
    }
    
    // 演示识别引擎
    if let Err(e) = demo_engine_plugin().await {
        error!("演示识别引擎失败: {}", e);
    }
    
    info!("\n演示完成！");
    Ok(())
}
